#ifndef DIRECTORYSCANNER_H
#define DIRECTORYSCANNER_H

#include <QObject>
#include <QString>
#include <QMap>
#include <QThread>

// 目录统计数据结构
struct DirectoryStats {
    QString name;             // 目录名
    int dir_count;            // 子目录数量
    int file_count;           // 文件数量
    long long total_lines;    // 源代码总行数
    QMap<QString, int> file_types;  // 文件类型统计
};

// 目录扫描器类，继承自QThread
class DirectoryScanner : public QThread
{
    Q_OBJECT
public:
    explicit DirectoryScanner(const QString &path, QObject *parent = nullptr);
    ~DirectoryScanner();

    // 获取统计结果
    DirectoryStats getStats() const { return m_stats; }

signals:
    void scanningFinished();  // 扫描完成信号
    void filesProcessed(int count);  // 文件处理进度信号

protected:
    void run() override;  // 线程执行函数

private:
    // 私有方法
    bool isSourceFile(const QString &filename);  // 判断是否是源代码文件
    long long countFileLines(const QString &filepath);  // 统计文件行数
    void scanDirectoryRecursive(DirectoryStats &stats);  // 递归扫描目录

    QString m_path;            // 扫描路径
    DirectoryStats m_stats;    // 统计结果
    bool m_abort = false;      // 终止标志

    // 线程安全相关成员
    std::atomic<int> m_totalFilesProcessed{0};  // 原子计数器，已处理文件数
    QElapsedTimer m_updateTimer;   // 限流计时器
    int m_lastEmittedCount = 0;    // 上次发送信号时的文件数
};

#endif // DIRECTORYSCANNER_H